package com.sromku.simple.fb.actions; import android.os.Bundle; import com.facebook.FacebookException; import com.facebook.FacebookOperationCanceledException; import com.facebook.Session; import com.facebook.widget.FacebookDialog; import com.facebook.widget.FacebookDialog.PendingCall; import com.facebook.widget.FacebookDialog.ShareDialogFeature; import com.facebook.widget.WebDialog; import com.facebook.widget.WebDialog.OnCompleteListener; import com.sromku.simple.fb.SessionManager; import com.sromku.simple.fb.entities.Feed; import com.sromku.simple.fb.entities.Feed.Builder.Parameters; import com.sromku.simple.fb.listeners.OnPublishListener; import com.sromku.simple.fb.utils.Errors; import com.sromku.simple.fb.utils.Errors.ErrorMsg; import com.sromku.simple.fb.utils.Logger; public class PublishFeedDialogAction extends AbstractAction { private OnPublishListener mOnPublishListener; private Feed mFeed; public PublishFeedDialogAction(SessionManager sessionManager) { super(sessionManager); } public void setFeed(Feed feed) { mFeed = feed; } public void setOnPublishListener(OnPublishListener onPublishListener) { mOnPublishListener = onPublishListener; } @Override protected void executeImpl() { if (sessionManager.isLogin(true)) { if (FacebookDialog.canPresentShareDialog(sessionManager.getActivity(), ShareDialogFeature.SHARE_DIALOG)) { FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(sessionManager.getActivity()) .setCaption(mFeed.getBundle().getString(Parameters.CAPTION)) .setDescription(mFeed.getBundle().getString(Parameters.DESCRIPTION)) .setName(mFeed.getBundle().getString(Parameters.NAME)) .setPicture(mFeed.getBundle().getString(Parameters.PICTURE)) .setLink(mFeed.getBundle().getString(Parameters.LINK)) .build(); PendingCall pendingCall = shareDialog.present(); sessionManager.trackFacebookDialogPendingCall(pendingCall, new FacebookDialog.Callback() { @Override public void onError(PendingCall pendingCall, Exception error, Bundle data) { sessionManager.untrackPendingCall(); Logger.logError(PublishFeedDialogAction.class, "Failed to share by using native dialog", error); if ("".equals(error.getMessage())) { Logger.logError(PublishFeedDialogAction.class, "Make sure to have 'app_id' meta data value in your manifest", error); } shareWithWebDialog(); } @Override public void onComplete(PendingCall pendingCall, Bundle data) { sessionManager.untrackPendingCall(); boolean didComplete = FacebookDialog.getNativeDialogDidComplete(data); String postId = FacebookDialog.getNativeDialogPostId(data); if (didComplete && postId != null) { mOnPublishListener.onComplete(postId); } else { mOnPublishListener.onFail("Canceled by user"); } } }); } else { shareWithWebDialog(); } } else { if (mOnPublishListener != null) { String reason = Errors.getError(ErrorMsg.LOGIN); Logger.logError(PublishFeedDialogAction.class, reason, null); mOnPublishListener.onFail(reason); } } } private void shareWithWebDialog() { WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(sessionManager.getActivity(), Session.getActiveSession(), mFeed.getBundle())).setOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(Bundle values, FacebookException error) { if (error == null) { final String postId = values.getString("post_id"); if (postId != null) { mOnPublishListener.onComplete(postId); } else { mOnPublishListener.onFail("Canceled by user"); } } else if (error instanceof FacebookOperationCanceledException) { // User clicked the "x" button mOnPublishListener.onFail("Canceled by user"); } else { mOnPublishListener.onException(error); } } }).build(); feedDialog.show(); } }